package com.zhonghui.dolo.manager.service.impl;

import com.zhonghui.dolo.manager.dao.ModuleDao;
import com.zhonghui.dolo.manager.dao.RoleModuleDao;
import com.zhonghui.dolo.manager.model.Module;
import com.zhonghui.dolo.manager.model.RoleModule;
import com.zhonghui.dolo.manager.model.vo.ModuleVo;
import com.zhonghui.dolo.manager.service.ModuleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ModuleServiceImpl implements ModuleService {

    @Autowired
    private ModuleDao moduleDao;
    @Autowired
    private RoleModuleDao roleModuleDao;

    @Override
    public List<ModuleVo> queryUserModel() {
        List<Module> modelList = moduleDao.queryModelListByParentId(0);
        List<ModuleVo> moduleVoList = new ArrayList<>();

        for (Module module : modelList) {
            ModuleVo moduleVo = new ModuleVo();
            BeanUtils.copyProperties(module, moduleVo);

            List<ModuleVo.SubModuleVo> subModuleVoList = new ArrayList<>();
            // 查二级菜单
            List<Module> subModuleList = moduleDao.queryModelListByParentId(module.getModuleId());
            for (Module subModule : subModuleList) {
                ModuleVo.SubModuleVo subModuleVo = new ModuleVo.SubModuleVo();
                BeanUtils.copyProperties(subModule, subModuleVo);
                subModuleVoList.add(subModuleVo);
            }
            moduleVo.setSubModelList(subModuleVoList);
            moduleVoList.add(moduleVo);
        }
        return moduleVoList;
    }

    @Override
    public List<ModuleVo> queryUserModelByRoleId(Integer roleId) {
        List<RoleModule> roleModuleList = roleModuleDao.queryRoleModuleListByRoleId(roleId);
        List<Integer> moduleIdList = new ArrayList<>();
        for (RoleModule roleModule : roleModuleList) {
            moduleIdList.add(roleModule.getModuleId());
        }
        List<Module> moduleList = moduleDao.queryModelListByModuleIds(moduleIdList);

        Map<Integer, ModuleVo> parentModuleMap = new HashMap<>();
        // 处理一级
        for (Module module : moduleList) {
            if (module.getParentId() == 0) {
                ModuleVo moduleVo = new ModuleVo();
                moduleVo.setName(module.getName());
                parentModuleMap.put(module.getModuleId(), moduleVo);
            }
        }
        // 处理二级目录
        for (Module module : moduleList) {
            if (module.getParentId() == 0) {
                continue;
            }

            // 获取一级节点
            ModuleVo parentModuleVo = parentModuleMap.get(module.getParentId());
            if (parentModuleVo == null) {
                continue;
            }
            List<ModuleVo.SubModuleVo> subModuleVoList = parentModuleVo.getSubModelList();
            if (subModuleVoList == null) {
                subModuleVoList = new ArrayList<>();
                parentModuleVo.setSubModelList(subModuleVoList);
            }
            ModuleVo.SubModuleVo subModuleVo = new ModuleVo.SubModuleVo();
            BeanUtils.copyProperties(module, subModuleVo);
            subModuleVoList.add(subModuleVo);
        }
        return new ArrayList<>(parentModuleMap.values());
    }
}
